package com.itheima.homework;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;

/*
一个大V直播抽奖，奖品是现金红包，分别有{2,588,888,1000,10000}五个奖金。
请使用代码模拟抽奖，打印出每个奖项，奖项的出现顺序要随机且不重复。打印效果如下：（随机顺序，不一定是下面的顺序）
    888元的奖金被抽出
    588元的奖金被抽出
    10000元的奖金被抽出
    1000元的奖金被抽出
    2元的奖金被抽出
    分析: 核心: 从数组中随机取出元素, 并且要求每次取出的内容不能重复!   -- 让索引随机起来!
 */
public class Homework07 {
    // 测试类: 专门用来运行我们要测试的代码的.
    public static void main(String[] args) {
        //1. 定义一个数组, 维护奖池红包数据
        int[] arr = {2,588,888,1000,10000};

        //2. 调用抽奖方法进行抽奖
        //lottery1(arr);

        lottery2(arr);

    }

    //面向对象式抽奖
    public static void lottery2(int[] arr) {
        //1. 把数组中的奖项放到集合容器中
        ArrayList<Integer> list = new ArrayList<>();
        for (int i = 0; i < arr.length; i++) {
            list.add(arr[i]);
        }

        //2. 将集合中的奖项顺序打乱
        Collections.shuffle(list);

        //3. 从打乱顺序的集合中抽奖
        for (Integer i : list) {
            System.out.println(i+"元的奖金被抽出");
        }

    }

    //抽奖方法
    public static void lottery1(int[] arr) {
        Random r = new Random();

        while (true){
            //定义一个标记, 假设奖池中没有奖了, 都抽完了
            boolean flag = false;

            //遍历数组
            for (int i = 0; i < arr.length; i++) {
                if (arr[i] != 0){
                    flag = true;
                }
            }

            //根据flag的值来决定还要不要继续抽
//            if (flag == false){
            if (!flag){
                return;
            }

            //1. 生成一个arr数组内的有效随机索引  -- [0,4]
            int index = r.nextInt(arr.length);

            //2. 获取该索引位置的元素
            int money = arr[index];

            //判断本次抽到的奖项是否有效, 有效才输出抽奖结果,无效则会到循环起点重新生成抽奖索引
            if (money != 0) {
                // 输出抽奖结果
                System.out.println(money + "元的奖金被抽出");

                // 将本次抽到的奖项对应的索引位置置为0  -- 将本次被抽到的将从奖池中移除
                arr[index] = 0;
            }
        }
    }

    //抽奖方法
    public static void lottery(int[] arr) {
        //定义一个计数器, 维护有效抽奖次数
        int count = 0;

        while (true){
            //当有效抽奖次数 == 奖池中的奖项个数, 说明奖被抽完了, 这时候就不需要再继续循环了.
            if (count == arr.length){
                break;
            }

            //1. 生成一个arr数组内的有效随机索引  -- [0,4]
            Random r = new Random();
            int index = r.nextInt(arr.length);

            //2. 获取该索引位置的元素
            int money = arr[index];

            //判断本次抽到的奖项是否有效, 有效才输出抽奖结果,无效则会到循环起点重新生成抽奖索引
            if (money != 0) {
                // 输出抽奖结果
                System.out.println(money + "元的奖金被抽出");

                // 将本次抽到的奖项对应的索引位置置为0  -- 将本次被抽到的将从奖池中移除
                arr[index] = 0;

                //有效抽奖次数+1
                count++;
            }
        }
    }
}
